home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
001-025
/
006
/
dadc
/
dadc.c
< prev
Wrap
C/C++ Source or Header
|
1995-03-13
|
7KB
|
262 lines
/*
** d a d c
**
** a digital computer impersonating an analog clock impersonating
** a digital clock.
** Copyright 1986
** By Perry S. Kivolowitz
**
** Placed in the public domain with two restrictions:
**
** (1) This header and the variable ``author'' not be modified
** (2) This program may not be used as part of ANY commercial
** product nor can any part of this code be used in any
** commercial product IN ANY WAY.
**
** Timer code lifted from GfxMem by Lou M.
*/
static char *author = "perry s. kivolowitz";
#include <exec/types.h>
#include <exec/nodes.h>
#include <exec/lists.h>
#include <exec/exec.h>
#include <exec/execbase.h>
#include <exec/ports.h>
#include <exec/devices.h>
#include <exec/memory.h>
#include <devices/timer.h>
#include <hardware/blit.h>
#include <graphics/copper.h>
#include <graphics/regions.h>
#include <graphics/rastport.h>
#include <graphics/gfxbase.h>
#include <graphics/gfxmacros.h>
#include <graphics/gels.h>
#include <intuition/intuition.h>
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct Library *DiskfontBase;
struct Window *w;
struct MsgPort *timerport = NULL, *CreatePort();
struct timerequest timereq;
struct RastPort rps[10];
struct BitMap bms[10];
long date[3];
long *s = &date[1];
#define S *s
struct TextFont *font;
struct TextAttr sapphire = {
"sapphire.font" ,
19 ,
FS_NORMAL ,
FPF_DISKFONT | FPF_PROPORTIONAL | FPF_DESIGNED | FPF_ROMFONT
};
#define XMAX 100
#define YMAX 33
int is_cli;
int close_flag = 0;
int rast_count = 0;
#define TIMER_DEVICE 0x0000001
#define TIMER_PORT 0x0000002
#define INTUITION 0x0000004
#define GFXLIB 0x0000008
#define THE_FONT 0x0000010
#define THE_WINDOW 0x0000020
#define FONTLIB 0x0000040
starttimer()
{
timereq.tr_time.tv_secs = 59;
timereq.tr_time.tv_micro = 0;
timereq.tr_node.io_Command = TR_ADDREQUEST;
timereq.tr_node.io_Flags = 0;
timereq.tr_node.io_Error = 0;
timereq.tr_node.io_Message.mn_ReplyPort = timerport;
SendIO((char *) &timereq.tr_node);
}
main(argc , argv)
char *argv[];
{
int i , flag = 0;
struct NewWindow nw;
struct IntuiMessage *msg , *GetMsg();
int waitmask;
if (argc) is_cli = 1;
IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library" , 1);
if (!IntuitionBase) {
if (is_cli) printf("%s: could not open intuition library\n" , argv[0]);
exit(FALSE);
}
close_flag |= INTUITION;
GfxBase = (struct GfxBase *) OpenLibrary("graphics.library" , 1);
if (!GfxBase) {
if (is_cli) printf("%s: could not open graphics library\n" , argv[0]);
close_stuff();
exit(FALSE);
}
close_flag |= GFXLIB;
DiskfontBase = (struct Library *) OpenLibrary("diskfont.library" , 0);
if (!DiskfontBase) {
if (is_cli) printf("%s: could not open disk font library\n" ,argv[0]);
close_stuff();
exit(FALSE);
}
close_flag |= FONTLIB;
if ((timerport = CreatePort("Timer Port", 0)) == NULL) {
close_stuff();
exit(1);
}
close_flag |= TIMER_PORT;
if (OpenDevice(TIMERNAME, UNIT_VBLANK, (char *) &timereq, 0) != 0) {
close_stuff();
exit(1);
}
close_flag |= TIMER_DEVICE;
font = OpenDiskFont(&sapphire);
if (!font) {
if (is_cli) printf("%s: cannot open disk font\n" , argv[0]);
close_stuff();
exit(1);
}
close_flag |= THE_FONT;
nw.LeftEdge = nw.TopEdge = 20;
nw.Width = XMAX;
nw.Height = YMAX;
nw.DetailPen = 0;
nw.BlockPen = 1;
nw.Title = "DADC";
nw.Flags = NOCAREREFRESH | WINDOWDRAG | WINDOWDEPTH | WINDOWCLOSE | SMART_REFRESH;
nw.FirstGadget = NULL;
nw.CheckMark = NULL;
nw.IDCMPFlags = CLOSEWINDOW;
nw.Type = WBENCHSCREEN;
nw.Screen = NULL;
nw.BitMap = NULL;
nw.MinWidth = nw.MinHeight = nw.MaxWidth = nw.MaxHeight = 0;
if (!(w = (struct Window *) OpenWindow(&nw))) {
if (is_cli) printf("%s: could not open window\n" , argv[0]);
close_stuff();
exit(1);
}
close_flag |= THE_WINDOW;
i = SetFont(w->RPort , font);
initialize_digits(font);
DateStamp(date);
scrollin(S % 10 , w->RPort , w->BorderLeft + 10 + (3 * (XMAX-20) / 4) , w->BorderTop , font->tf_YSize , font->tf_XSize);
scrollin((S / 10) % 6 , w->RPort , w->BorderLeft + 10 + (XMAX-20) / 2 , w->BorderTop , font->tf_YSize , font->tf_XSize);
scrollin((S / 60) % 10 , w->RPort , w->BorderLeft + 10 + (XMAX-20) / 4 , w->BorderTop , font->tf_YSize , font->tf_XSize);
S = (S / 60) > 9 ? 1 : 0;
scrollin(S , w->RPort , w->BorderLeft + 10 , w->BorderTop , font->tf_YSize , font->tf_XSize);
waitmask = (1 << w->UserPort->mp_SigBit) | (1 << timerport->mp_SigBit);
while (!flag) {
starttimer();
Wait(waitmask);
while (msg = GetMsg(w->UserPort)) {
switch (msg->Class) {
case CLOSEWINDOW:
flag = 1;
break;
}
ReplyMsg(msg);
}
(void) GetMsg(timerport);
if (flag) continue;
DateStamp(date);
scrollin(S % 10 , w->RPort , w->BorderLeft + 10 + (3 * (XMAX-20) / 4) , w->BorderTop , font->tf_YSize , font->tf_XSize);
if (S % 10 == 0) scrollin((S / 10) % 6 , w->RPort , w->BorderLeft + 10 + (XMAX-20) / 2 , w->BorderTop , font->tf_YSize , font->tf_XSize);
if (S % 60 == 0) scrollin((S / 60) % 10 , w->RPort , w->BorderLeft + 10 + (XMAX-20) / 4 , w->BorderTop , font->tf_YSize , font->tf_XSize);
if (S % 60 != 0) continue;
S = S / 60;
if (S == 10) S = 1;
else if (S != 0) continue;
scrollin(S , w->RPort , w->BorderLeft + 10 , w->BorderTop , font->tf_YSize , font->tf_XSize);
}
close_stuff();
exit(1);
}
close_stuff()
{
if (close_flag & TIMER_DEVICE) {
AbortIO(&timereq);
CloseDevice(&timereq);
}
if (close_flag & TIMER_PORT) DeletePort(timerport);
if (close_flag & THE_WINDOW) CloseWindow(w);
if (close_flag & THE_FONT) CloseFont(font);
deallocate_rasters();
if (close_flag & GFXLIB) CloseLibrary(GfxBase);
if (close_flag & FONTLIB) CloseLibrary(DiskfontBase);
if (close_flag & INTUITION) CloseLibrary(IntuitionBase);
(void) OpenWorkBench();
exit(TRUE);
}
initialize_digits(font)
struct TextFont *font;
{
int i;
char *digits = "0123456789";
for (i = 0; i < 10; i++) {
InitRastPort(&rps[i]);
InitBitMap(&bms[i] , 2 , 30 , 30);
bms[i].Planes[0] = AllocRaster(30 , 30);
if (bms[i].Planes[0] == NULL) {
close_stuff();
exit(1);
}
rast_count++;
bms[i].Planes[1] = AllocRaster(30 , 30);
if (bms[i].Planes[1] == NULL) {
close_stuff();
exit(1);
}
rast_count++;
rps[i].BitMap = &bms[i];
SetFont(&rps[i] , font);
SetRast(&rps[i] , 0);
Move(&rps[i] , 0 , font->tf_Baseline);
Text(&rps[i] , digits + i , 1);
}
}
deallocate_rasters()
{
register int i;
for (i = 0; i < 10; i++) {
if (rast_count-- > 0) FreeRaster(bms[i].Planes[0] , 30 , 30);
if (rast_count-- > 0) FreeRaster(bms[i].Planes[1] , 30 , 30);
}
}
scrollin(i , rp , begx , begy , dy , dx)
struct RastPort *rp;
{
int counter;
for (counter = 0; counter < dy; counter++) {
ScrollRaster(rp,0,1,begx,begy,begx+dx,begy+dy);
ClipBlit(&rps[i],0,counter,rp,begx,begy+dy,dx,1,0xC0);
Delay(4);
}
}